Appearance
HJ87 密码强度等级
本节目标:理解“HJ87 密码强度等级”的核心思路,并能把它用于实际开发或面试表达。 描述 密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符
二、字母: 0 分: 没有字母 10 分: 密码里的字母全都是小(大)写字母 20 分: 密码里的字母符合”大小写混合“
三、数字: 0 分: 没有数字 10 分: 1 个数字 20 分: 大于1 个数字
四、符号: 0 分: 没有符号 10 分: 1 个符号 25 分: 大于1 个符号
五、奖励(只能选符合最多的那一种奖励): 2 分: 字母和数字 3 分: 字母、数字和符号 5 分: 大小写字母、数字和符号 最后的评分标准: >= 90: 非常安全 >= 80: 安全(Secure) >= 70: 非常强 >= 60: 强(Strong) >= 50: 一般(Average) >= 25: 弱(Weak) >= 0: 非常弱(Very_Weak)
对应输出为:
VERY_SECURE SECURE VERY_STRONG STRONG AVERAGE WEAK VERY_WEAK
请根据输入的密码字符串,进行安全评定。
注: 字母:a-z, A-Z 数字:0-9 符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看) !"#$%&'()*+,-./ (ASCII码:0x21~0x2F) :;<=>?@ (ASCII码:0x3A~0x40) []^_` (ASCII码:0x5B~0x60) {|}~ (ASCII码:0x7B~0x7E)
提示: 1 <= 字符串的长度<= 300 输入描述: 输入一个string的密码 输出描述: 输出密码等级 示例1 输入: 38$@NoNoN ==复制== 输出: VERY_SECURE ==复制== 说明: 样例的密码长度大于等于8个字符,得25分;大小写字母都有所以得20分;有两个数字,所以得20分;包含大于1符号,所以得25分;由于该密码包含大小写字母、数字和符号,所以奖励部分得5分,经统计得该密码的密码强度为25+20+20+25+5=95分。 示例2 输入: Jl)M:+ ==复制== 输出: AVERAGE ==复制== 说明: 示例2的密码强度为10+20+0+25+0=55分。
def password_strength_optimized(password): length_score = digit_count = upper_count = lower_count = symbol_count = 0
一、密码长度评分
if len(password) <= 4: length_score = 5 elif 5 <= len(password) <= 7: length_score = 10 else: length_score = 25
通过单次遍历密码,统计各类字符数量
for char in password: if char.isdigit(): digit_count += 1 elif char.isupper(): upper_count += 1 elif char.islower(): lower_count += 1 elif not char.isalnum(): symbol_count += 1
二、字母评分
letter_score = 20 if upper_count > 0 and lower_count > 0 else 10 if upper_count > 0 or lower_count > 0 else 0
三、数字评分
digit_score = 20 if digit_count > 1 else 10 if digit_count == 1 else 0
四、符号评分
symbol_score = 25 if symbol_count > 1 else 10 if symbol_count == 1 else 0
五、奖励评分
bonus_score = 5 if upper_count and lower_count and digit_count and symbol_count else
3 if letter_score and digit_count and symbol_count else
2 if letter_score and digit_count else 0
计算总分
total_score = length_score + letter_score +
digit_score + symbol_score + bonus_score
判断密码等级
if total_score >= 90: return "VERY_SECURE" elif total_score >= 80: return "SECURE" elif total_score >= 70: return "VERY_STRONG" elif total_score >= 60: return "STRONG" elif total_score >= 50: return "AVERAGE" elif total_score >= 25: return "WEAK" else: return "VERY_WEAK"
输入密码
password = input()
输出密码等级
print(password_strength_optimized(password))
